#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
#define MaxSize 50
//栈  在栈顶进行插入和删除，后进先出
//顺序栈
//声明顺序栈的类型
typedef struct
{
    ElemType data[MaxSize];//存放栈的数据元素
    int top; //栈顶指针
}SqStack;  //顺序栈类型
//栈到顺序栈的映射  a1,a2```an------>a1-0,a2-1,````an-1-MaxSize-1,n-1-top
//栈空条件：s->top==-1 //s为栈指针
//栈满条件：s->top==MaxSize-1
//进栈操作：栈顶指针top+1.将元素e放在栈顶指针处
//出栈操作：将栈顶指针top处元素取出给e，将栈顶指针-1
//初始化栈
void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
//销毁栈
void DestroyStack(SqStack *&s)
{
    free(s);//直接释放s栈指针的内存空间
}
//判断栈是否为空
bool StackEmpty(SqStack *s)
{
    return(s->top==-1);
}
//进栈
bool Push(SqStack *&s,ElemType e)
{
    if(s->top==MaxSize-1)
        return false;//判断是否栈满
    s->top++;//栈顶指针+1
    s->data(s->top)=e;
    return true;
}
//出栈
bool Pop(SqStack *&s,ElemType &e)
{
    if(s->top==-1)
        return false;//判断栈为空
    e=s->data[s->top];//取栈顶元素
    s->top--;//栈顶指针-1
    return true;
}
//取栈顶元素
bool GetTop(SqStack *s,ElemType e)
{
    if(s->top==-1)
        return false;//判断栈为空
    e=s->data[s->top];
    return true;
}
void trans(char *tokens,char posttokens[])
{
    char e;
    SqStack *Optr;
    InitStack(Optr);
    int i=0;
    while(*tokens!='\0')
    {
        switch(*tokens)
        {
            case '(':
                Push(Optr,'(');
                tokens++;
                break;
            case ')':
                Pop(Optr,e);
                while(e!='(')
                {
                    posttokens[i++]=e;
                    Pop(Optr,e)
                }
                tokens++;
                break;
            case '+':
            case '-':
                while(!StackEmpty(Optr)
                {
                    GetTop(Optr,e)
                    if(!e='(')
                    {
                        posttokens[i++]=e;
                        Pop(Optr,e);
                    }
                    else
                        break;
                }
                Push(Optr,*tokens);
                tokens++;
                break;
            case '*':
            case '/':
                while(!StackEmpty(Optr)
                {
                    GetTop(Optr,e)
                    if(e=='*' || e=='/')
                    {
                        posttokens[i++]=e;
                        Pop(Optr,e);
                    }
                    else
                        break;
                }
                Push(Optr,*tokens);
                tokens++;
                break;
            default:
                while(*tokens>='0' && *tokens<='9')
                {
                    posttokens[i++]=*tokens;
                    tokens++;
                }
                posttokens[i++]='#';
        }
    }
    while(!StackEmpty(Optr))
    {
        posttokens[i++]=e;
    }
    posttokens[i]='\0';
    DestroyStack(Optr);
}
int evalRPN(char ** tokens, int tokensSize){
    double d,a,b,c,e;
    SqStack *opnd;
    InitStack(opnd);
    while(*tokens!=='\0')
    {
        switch(* tokens)
        {
            case '+':
                Pop(opnd,a);
                Pop(opnd,b);
                c=b+a;
                Push(opnd,c);
                break;
            case '-':
                Pop(opnd,a);
                Pop(opnd,b);
                c=b-a;
                Push(opnd,c);
                break;
            case '*':
                Pop(opnd,a);
                Pop(opnd,b);
                c=b*a;
                Push(opnd,c);
                break;
            case '/':
                Pop(opnd,a);
                Pop(opnd,b);
                if(a!=0){
                    c=b/a;
                    Push(opnd,c);
                    break;}
                else 
                {
                    printf("除零错误");
                    exit(0);
                }
                break;
             default:
                d=0;
                while(*tokens>='0' && *tokens<='9')
                {
                    d=10*d+*tokens-'0';
                    tokens++;
                }  
                Push(opnd,d);
                break; 
        }
        tokens++;
    }
    GetTop1(opnd,e);
    DestroyStack(opnd);
    return e;
}
int main()
{
    char tokens;
    scanf("%s\n",&tokens);
    char posttokens[MaxSize];
    trans(tokens,posttokens);
    printf("中缀表达式：%s\n",tokens);
    printf("后缀表达式：%s\n",posttokens);
    printf("表达式值：%g\n",evalRPN(posttokens));
    return 1;
}